package com.gitee.jnxj.nraft.common.core;

import lombok.Builder;
import lombok.Data;
import lombok.ToString;

import java.util.List;

/**
 * 节点信息
 *
 * @author 江南小俊
 * @since 2021/7/12
 **/
@Data
@Builder
@ToString
public class Node {

    /**
     * 节点序号
     **/
    private int id;
    //所有服务器上的持久化状态，在回复RPC之前更新持久化存储[currentTerm,votedFor]
    /**
     * 服务器知道的最近任期，当服务器启动时初始化为0，单调递增 (持久化数据)
     **/
    private long currentTerm;
    /**
     * 当前任期中，该服务器给投过票的candidateId，如果没有则为null (持久化数据)
     **/

    private Integer votedFor;

    //所有服务器上的易失性状态[commitIndex,lastApplied]
    /**
     * 已知被提交的最高日志条目索引号，一开始是0，单调递增
     **/
    private long commitIndex;
    /**
     * 应用到状态机的最高日志条目索引号，一开始为0，单调递增
     **/
    private long lastApplied;

    // leader上的易失性状态，在选举之后重新初始化
    private List<Peer> peers;
    /**
     * 节点类型
     **/
    private NodeType type;
    /**
     * 选举超时时间 3000ms-5000ms
     **/
    private int electionAlarm;

    public enum NodeType {
        LEADER, FOLLOWER, CANDIDATE
    }
}
